import matplotlib
matplotlib.use('TkAgg')
from matplotlib.ticker import MultipleLocator, FormatStrFormatter, AutoLocator, PercentFormatter
import matplotlib.pyplot as plt
import numpy as np
import scienceplots

def example1():#画1行2个图，及对各图的访问,对一个figure划分多个axes
    fig, ax = plt.subplots(nrows=1, ncols=2)  # Create a figure containing a single Axes.
    ax[0].plot([1, 2, 3, 4], [1, 4, 2, 3], [1, 2, 3, 4], [2, 1, 5, 7])  # Plot some data on the Axes.
    ax[1].plot([1, 2, 3, 4], [2, 8, 4, 6])  # Plot some data on the Axes.
    plt.show()
def example2():# 画2行2个图，及对各图的访问,对一个figure划分多个axes
    fig, ax = plt.subplots(nrows=2, ncols=2)  # Create a figure containing a single Axes.
    ax[0, 0].plot([1, 2, 3, 4], [1, 4, 2, 3])  # Plot some data on the Axes.
    ax[0, 1].plot([1, 2, 3, 4], [2, 8, 4, 6])  # Plot some data on the Axes.
    ax[1, 0].plot([1, 2, 3, 4], [1, 4, 2, 3])  # Plot some data on the Axes.
    ax[1, 1].plot([1, 2, 3, 4], [2, 8, 4, 6])
    plt.show()
def example3():#自定义各图所占行列数
    fig, axs = plt.subplot_mosaic([
        ['left', 'mid_top', 'right_top'],
        ['left', 'mid_bottom', 'right_bottom']
    ])
    plt.show()
def example4():#调整x，y的位置，刻度，值，网格线
    xlabel_kwargs = {
        'xlabel': 'X label',  # 标签文本（注意参数名是'xlabel'，不是字符串）
        'fontsize': 14,
        'fontfamily': 'Times New Roman',
        'fontweight': 'bold',#light，normal，bold
        'fontstyle': 'italic',#normal，italic
        'color': '#181a1f'
    }
    tick_kwargs = {
        'axis': 'both',  # 针对x轴（'y'表示y轴，'both'表示双轴）
        'which': 'minor',# major针对主刻度（'minor'表示副刻度，'both'表示两者）
        'labelsize': 8, # 字体大小
        'labelcolor': '#181a1f', # 字体颜色
        'labelfontfamily': 'Times New Roman',  # 字体
    }
    fg, ax = plt.subplots()
    # 调整边框
    ax.spines['bottom'].set_color('black')
    ax.spines['left'].set_color('black')
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    # 调整x轴
    ax_x = ax.xaxis
    ax_x.set_major_locator(MultipleLocator(1))  # 定义主刻度间隔
    ax_x.set_minor_locator(MultipleLocator(0.5))  # 定义副刻度间隔
    ax_x.set_major_formatter(FormatStrFormatter('%d'))  # 定义主刻度值
    ax_x.set_minor_formatter(FormatStrFormatter('%.1f'))  # 定义副刻度值
    ax.tick_params(**tick_kwargs)#设置刻度样式
    for tick in ax.get_xticklabels(minor=True):#因tick_params不支持fontweight，故采用这种方式单独设置加黑
        tick.set_fontweight('bold')
    ax.set_xlim(-5, 5)  # 定义x轴起始范围
    ax.set_xlabel(**xlabel_kwargs)#设置xlabel样式
    # 调整y
    ax.spines['left'].set_position(('data', 0))  # 3. 移动左侧轴线（y轴）到 x=0 处
    ax_y = ax.yaxis
    ax_y.set_major_locator(MultipleLocator(0.1))  # 按10%增加
    ax_y.set_major_formatter(PercentFormatter(xmax=1))
    ax.set_ylabel('y', fontsize=12, loc="top")#定义标签y的字号，位置也可以像x那样定义样式
    plt.tight_layout()
    plt.grid(axis='x',which='major')#显示纵向网格线
    plt.show()
def example5():#折线图及绘图标记,如果只有纵坐标，横坐标默认0，1，2...
    fg,ax = plt.subplots()
    x = np.array([1,2,3])
    y = np.array([5,3,6])
    ax.plot(x,y,'o--',color='#f9b178',label='line 1', linewidth=5)
    plt.show()
def example6():#函数图
    fg,ax = plt.subplots()
    x = np.arange(0,2*np.pi,0.1)
    y = np.sin(x)
    ax.plot(x,y)
    plt.show()
def example7():#散点图
    import matplotlib.pyplot as plt
    import numpy as np

    x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
    y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
    sizes = np.array([20, 50, 100, 200, 500, 1000, 60, 90])
    # colors = np.array(["red", "green", "black", "orange", "purple", "beige", "cyan", "magenta"])
    colors = np.array([0, 40, 45, 50, 55, 60, 90, 100])#当使用cmap时，colors需要是这个形式
    plt.scatter(x, y, s=sizes, c=colors, cmap='viridis')
    plt.colorbar()
    plt.show()
def example8():#柱状图
    import matplotlib.pyplot as plt
    import numpy as np

    x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
    y = np.array([12, 22, 6, 18])

    plt.bar(x, y, color = ["#4CAF50","red","hotpink","#556B2F"], width = 0.1)#竖着画
    # plt.barh(x, y)#横着画
    plt.show()
def example9():#饼图
    y = np.array([35, 25, 25, 15])#数据逆时针排布
    plt.pie(y, labels=['A','B','C','D'], # 设置饼图标签
        colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"],# 设置饼图颜色
        autopct='%1.1f%%', #显示扇形的百分比标签
        shadow=True,#为饼图添加阴影
        startangle=0,#规定饼图的 “第一个扇形” 从哪个角度开始绘制（以 x 轴正方向为 0°，逆时针旋转为正方向）。
        explode = (0, 0.1, 0, 0))#0.1：该扇形会向外 “突出”，距离中心的距离为饼图半径的 10%
    plt.title("RUNOOB Pie Test")  # 设置标题
    plt.show()
def example10():#直方图
    # 生成三组随机数据
    data1 = np.random.normal(-2, 1, 1000)
    data2 = np.random.normal(0, 1, 1000)
    data3 = np.random.normal(2, 1, 1000)

    # 绘制直方图
    plt.hist(data1, bins=30, alpha=0.5, label='Data 1')
    plt.hist(data2, bins=30, alpha=0.5, label='Data 2')
    plt.hist(data3, bins=30, alpha=0.5, label='Data 3')

    # 设置图表属性
    plt.title('RUNOOB hist() TEST')
    plt.xlabel('Value')
    plt.ylabel('Frequency')
    plt.legend()

    # 显示图表
    plt.show()
def example11():#灰度图
    # 生成一个二维随机数组
    img = np.random.rand(10, 10)
    # 绘制灰度图像
    plt.imshow(img, cmap='gray')
    # 显示图像
    plt.show()
def example12():#色彩图
    # 生成一个随机的彩色图像
    img = np.random.rand(10, 10, 3)
    # 绘制彩色图像
    plt.imshow(img)
    # 显示图像
    plt.show()
def example13():#热度图
    # 生成一个二维随机数组
    data = np.random.rand(10, 10)
    # 绘制热力图
    plt.imshow(data, cmap='seismic', interpolation='bilinear')
    # 显示图像
    plt.colorbar()
    plt.show()
def example14():
    n=4
    a = np.reshape(np.linspace(0, 1, n ** 2), (n, n))
    plt.subplot(111)#133=行数 + 列数 + 子图序号,与fig, ax = plt.subplots(nrows=1,ncols=3)然后通过ax[0]访问第一个子图和plt.subplot(131)效果一样
    plt.imshow(a, cmap='viridis', interpolation='bicubic')
    plt.yticks([])
    plt.xticks(range(n))
    # Viridis 映射，双立方混合
    plt.title('Viridis color map, bicubic blending', y=1.02, fontsize=12)
    plt.show()